package 动态规划.另类的;

import java.util.Arrays;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/3/22 20:38
 */
public class leetcode1626无矛盾的最佳球队 {


    /*
     只要把按照 年龄进行 升序 排序, 年龄相同,再根据 分数进行升序 排列! 剩下的
       如果把上面的 排序规则, 给 明白的话, 剩下的就是 , 上升(并不要求连续!)子序列的东西了!
     */
    public int solution(int scores[],int ages[]){
        int n = scores.length,nums[][]= new int[n][2],dp[] = new int[n];
        for(int i = 0;i < n;i++){
            nums[i][0] = ages[i];
            nums[i][1] = scores[i];
        }
        /*
         按照 年龄进行 升序 排序, 年龄相同,再根据 分数进行升序 排列!
         */
        Arrays.sort(nums,(a,b) -> {
            if(a[0] == b[0]){
                return a[1] - b[1];
            }
            return a[0] - b[0];
        });
        // 下面, 这样写 更加的有逼格!
        Arrays.sort(nums,(a,b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
        dp[n - 1] = nums[n - 1][1];
        int ans = dp[n - 1];
        for(int i = n - 2;i >= 0;i--){
            dp[i] = nums[i][1];
            for(int j = i + 1;j < n;j++){
                if(nums[i][0] == nums[j][0] || nums[i][1] <= nums[j][1]){
                    dp[i] = Math.max(dp[i],dp[j] + nums[i][1]);
                }
            }
            ans = Math.max(dp[i],ans);
        }
        return ans;
    }


    /*
     这种 是 连续子数组的 那种思想,
     而这个题 是子序列
     */
    public int solution1(int scores[],int ages[]){
            int n = scores.length,nums[][]= new int[n][n],dp[] = new int[n];
            for(int i = 0;i < n;i++){
                nums[i][0] = ages[i];
                nums[i][1] = scores[i];
            }
            Arrays.sort(nums,(a,b) -> a[0] - b[0]);
            dp[n - 1] = nums[n - 1][1];
            int ans = 0;
            for(int i = n - 2;i >= 0;i--){
                dp[i] = nums[i][1];
                if(nums[i][0] == nums[i + 1][0]) {
                    dp[i] = dp[i + 1] + nums[i][1];
                }
                // < 的情况
                else if(nums[i][1] <= nums[i + 1][1]){
                    dp[i] = dp[i + 1] + nums[i][1];
                }
                ans = Math.max(ans,dp[i]);
            }
            return ans;
    }




}
